package com.edu.juc.cas;

import java.util.concurrent.atomic.AtomicInteger;

/**
 * CAS: compare and swap ：比较并交换
 * 包含3个操作数：
 * -内存位置、预期原值、更新值
 * <p>
 * 执行CAS操作时，只有内存位置的值等于预期原值，才将更新值赋给内存位置。
 * 否则，处理器不做任何操作，多个线程同时执行CAS操作，只有一个会成功。
 * <p>
 * 当且仅当旧的预期值A和内存值V相同时，将内存值V修改为B，否则什么都不做或重来，
 * 重来重试的这种行为称为----自旋。
 * <p>
 * CAS是JDK提供的非阻塞原子性操作，它通过硬件保证了比较-更新的原子性。
 * CAS是一条CPU的原子指令（cmpxchg），不会造成所谓的数据不一致问题，
 * Unsafe提供的CAS方法(如compareAndSwapXXX)底层实现即为CPU指令cmpxchg。
 * <p>
 * 自旋锁(spinlock)
 * 是指尝试获取锁的线程不会立即阻塞，而是采用循环的方式去尝试获取锁，当线程发现线程被占用时，会不断循环判断锁的状态，直到获取。
 * <p>
 * CAS两大缺点：
 * 1. 如果CAS失败，会一直进行尝试。如果CAS长时间不成功，会导致CPU高速轮转，消耗CPU资源。
 * 2. CAS会导致“ABA”问题。 （解决： 版本号方案）
 */
public class CASMain {
    public static void main(String[] args) {
        AtomicInteger atomicInteger = new AtomicInteger(5);
        System.out.println(atomicInteger.compareAndSet(5, 2019) + "\t current data:" + atomicInteger.get());
        System.out.println(atomicInteger.compareAndSet(5, 2019) + "\t current data:" + atomicInteger.get());
    }
}
